﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Petaframe.DataAccess
{
    /// <summary>
    /// Veritabanına yapılan insert işlemi sonucu primary key olan sütundaki veriyi döndürmek için kullanılır.
    /// bu sınıfın amacı primary key sütununa veri girişi otomatik olarak yapılırsa ve girilen veri int tipi
    /// haricinde (GUID, string, Geo vs) bir tip olursa kullanmak içindir.
    /// </summary>
    internal class  OracleReturningInsertCommandBuilder: CommandStringBuilderBase, ICommandStringBuilder
    {
        public ICommandStringBuilder CommandString(string text)
        {
            _sqlQuery.Append(text);
            return this;
        }

        public ICommandStringBuilder CommandString(TableInfo table)
        {
            _sqlQuery.AppendFormat("insert into {0} (", table.TableName);

            bool commaNeeded = false;
            foreach (var item in table.Properties)
            {
                if (!item.AutoIncrement)
                {
                    if (commaNeeded)
                        _sqlQuery.Append(StringTools.CommaSpace);

                    _sqlQuery.Append(item.PropertyName);
                    commaNeeded = true;
                }
            }
            
            _sqlQuery.Append(") values (");


            commaNeeded = false;
            foreach (var item in table.Properties)
            {
                //eğer autoincrement bir property değilse sorguya ekle
                if (!item.AutoIncrement)
                {
                    if (commaNeeded)
                        _sqlQuery.Append(StringTools.CommaSpace);

                    _sqlQuery.Append(item.ParameterInfo.DatabaseParameter.ParameterName);
                    commaNeeded = true;
                }

            }

            _sqlQuery.AppendFormat(") returning");

            foreach (var item in table.Properties)
            {
                if(item.PrimaryKey)
                    _sqlQuery.AppendFormat(" {0} into {1}", item.PropertyName, item.ParameterInfo.DatabaseParameter.ParameterName);
            }
           // _sqlQuery.AppendFormat(") returning {0} into {1}", table.PrimaryKeys[0], table.Parameters[table.PrimaryKeys[0]].DbParameter.ParameterName);

            return this;
        }


        /// <summary>
        /// Oluşturulan sql komutunu döndürür.
        /// </summary>
        /// <returns>Sql command string</returns>
        public string ToSqlCommandString()
        {
            return _sqlQuery.ToString();
        }
    }
}
